package org.xxpay.core.common.domain;

import org.xxpay.core.common.util.I18nUtil;

/**
 * 支持国际化的业务响应类
 * 扩展原有的BizResponse，添加国际化支持
 *
 * @author xxpay
 */
public class I18nBizResponse extends BizResponse {

    // 成功和失败的常量
    public static final int CODE_SUCCESS = 0;
    public static final int CODE_FAIL = -1;

    // 数据字段，用于存储响应数据
    private Object data;

    public I18nBizResponse(int code, String msg) {
        super(code, msg);
    }

    public I18nBizResponse(int code, String msg, Object data) {
        super(code, msg);
        this.data = data;
    }

    /**
     * 成功响应（国际化消息）
     *
     * @param msgKey 消息键
     * @param args 参数
     * @return 响应对象
     */
    public static I18nBizResponse success(String msgKey, Object... args) {
        String message = I18nUtil.getMessage(msgKey, args);
        return new I18nBizResponse(CODE_SUCCESS, message);
    }

    /**
     * 成功响应（带数据）
     *
     * @param data 数据
     * @param msgKey 消息键
     * @param args 参数
     * @return 响应对象
     */
    public static I18nBizResponse success(Object data, String msgKey, Object... args) {
        String message = I18nUtil.getMessage(msgKey, args);
        return new I18nBizResponse(CODE_SUCCESS, message, data);
    }

    /**
     * 成功响应（默认消息）
     *
     * @return 响应对象
     */
    public static I18nBizResponse success() {
        String message = I18nUtil.getMessage("operation.success", "操作成功");
        return new I18nBizResponse(CODE_SUCCESS, message);
    }

    /**
     * 成功响应（带数据，默认消息）
     *
     * @param data 数据
     * @return 响应对象
     */
    public static I18nBizResponse success(Object data) {
        String message = I18nUtil.getMessage("operation.success", "操作成功");
        return new I18nBizResponse(CODE_SUCCESS, message, data);
    }

    /**
     * 失败响应（国际化消息）
     *
     * @param msgKey 消息键
     * @param args 参数
     * @return 响应对象
     */
    public static I18nBizResponse error(String msgKey, Object... args) {
        String message = I18nUtil.getMessage(msgKey, args);
        return new I18nBizResponse(CODE_FAIL, message);
    }

    /**
     * 失败响应（带错误码）
     *
     * @param code 错误码
     * @param msgKey 消息键
     * @param args 参数
     * @return 响应对象
     */
    public static I18nBizResponse error(int code, String msgKey, Object... args) {
        String message = I18nUtil.getMessage(msgKey, args);
        return new I18nBizResponse(code, message);
    }

    /**
     * 失败响应（默认消息）
     *
     * @return 响应对象
     */
    public static I18nBizResponse error() {
        String message = I18nUtil.getMessage("operation.failed", "操作失败");
        return new I18nBizResponse(CODE_FAIL, message);
    }

    /**
     * 参数错误响应
     *
     * @param args 参数
     * @return 响应对象
     */
    public static I18nBizResponse paramError(Object... args) {
        String message = I18nUtil.getMessage("param.error", "参数错误", args);
        return new I18nBizResponse(CODE_FAIL, message);
    }

    /**
     * 数据不存在响应
     *
     * @param args 参数
     * @return 响应对象
     */
    public static I18nBizResponse dataNotExists(Object... args) {
        String message = I18nUtil.getMessage("data.not.exists", "数据不存在", args);
        return new I18nBizResponse(CODE_FAIL, message);
    }

    /**
     * 权限不足响应
     *
     * @return 响应对象
     */
    public static I18nBizResponse noPermission() {
        String message = I18nUtil.getMessage("no.permission", "权限不足");
        return new I18nBizResponse(CODE_FAIL, message);
    }

    /**
     * 系统异常响应
     *
     * @param args 参数
     * @return 响应对象
     */
    public static I18nBizResponse systemError(Object... args) {
        String message = I18nUtil.getMessage("system.error", "系统异常", args);
        return new I18nBizResponse(99999, message);
    }

    /**
     * 获取数据
     *
     * @return 数据对象
     */
    public Object getData() {
        return data;
    }

    /**
     * 设置数据
     *
     * @param data 数据对象
     * @return 当前对象，支持链式调用
     */
    public I18nBizResponse setData(Object data) {
        this.data = data;
        return this;
    }

    @Override
    public String toString() {
        return "I18nBizResponse{" +
                "code=" + getCode() +
                ", msg='" + getMsg() + '\'' +
                ", data=" + data +
                '}';
    }
}
